#include <nds.h>
#include <stdio.h>
#include "warhol.h"
#include "selector.h"

u16 pal[] = {
  RGB15(31,31,31),
  RGB15(25,25,25),
  RGB15(20,20,20),
  RGB15(15,15,15),
  RGB15(10,10,10),
  RGB15(0,0,0),
  
  RGB15(31,25,25),
  RGB15(31,15,15),
  RGB15(31,5,5),
  RGB15(25,0,0),
  RGB15(20,0,0),
  RGB15(10,0,0),
  
  RGB15(31,25,15),
  RGB15(31,15,5),
  RGB15(31,10,0),
  RGB15(25,10,0),
  RGB15(20,8,0),
  RGB15(10,4,0),
  
  RGB15(31,31,20),
  RGB15(31,31,5),
  RGB15(28,28,0),
  RGB15(24,24,0),
  RGB15(20,20,0),
  RGB15(10,10,0),
  
  RGB15(25,31,25),
  RGB15(15,31,15),
  RGB15(5,31,5),
  RGB15(0,25,0),
  RGB15(0,20,0),
  RGB15(0,10,0),
  
  RGB15(20,31,31),
  RGB15(5,31,31),
  RGB15(0,28,28),
  RGB15(0,24,24),
  RGB15(0,20,20),
  RGB15(0,10,10),
  
  RGB15(25,25,31),
  RGB15(15,15,31),
  RGB15(5,5,31),
  RGB15(0,0,25),
  RGB15(0,0,20),
  RGB15(0,0,10),
  
  RGB15(31,20,31),
  RGB15(31,5,31),
  RGB15(28,0,28),
  RGB15(24,0,24),
  RGB15(20,0,20),
  RGB15(10,0,10),
  
};

void intercambia(int iniX,int  iniY, int finX,int  finY, uint16 *mapa);

int main(void)
{
	consoleDemoInit();
	

	// Configuración de pantalla principal
	REG_DISPCNT = MODE_5_2D	// Modo5 (permite modo extendido)
	| DISPLAY_BG2_ACTIVE;	// Activar fondo 2

	// Configuración de pantalla secundari
	REG_DISPCNT_SUB = MODE_5_2D	// Modo5 (permite modo extendido)
	| DISPLAY_BG0_ACTIVE;	// Activar fondo 2

	// Configuración de bloque A de la VRAM
	VRAM_A_CR = VRAM_ENABLE	// Habilitar
	| VRAM_A_MAIN_BG;		// Asignar a Main (al comienzo)

	// Configuración de bloque C de la VRAM
	VRAM_C_CR = VRAM_ENABLE	// Habilitar
	| VRAM_C_SUB_BG;		// Asignar a Main (al comienzo)


	// Configuración de fondo 2
	BGCTRL[2] = BG_MAP_BASE(0)	// Al comienzo de la VRAM
	| BgSize_B8_512x512; 	// 512x512, 8bpp


	// Configuración de fondo 2
	BGCTRL_SUB[0] = BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(0) | BG_TILE_BASE(1);


	// Copia del fondo
// 	dmaCopy(warholBitmap, BG_GFX, 256*192);
// 	dmaCopy(warholPal, BG_PALETTE, 256*2);

	// Matriz de transformación
	bgTransform[2]->xdx = 512;
	bgTransform[2]->ydx = 0;
	bgTransform[2]->xdy = 0;
	bgTransform[2]->ydy = 512;
	bgTransform[2]->dx  = 0;
	bgTransform[2]->dy  = 0;

	memcpy(BG_PALETTE_SUB, selectorPal, selectorPalLen);
	memcpy(BG_MAP_RAM_SUB(0), selectorMap, selectorMapLen);
	memcpy(BG_TILE_RAM_SUB(1), selectorTiles, selectorTilesLen);
	
	static touchPosition pos ;
	static uint16 * mapaTeselado = selectorMap;
	int finX=0, finY=0, iniX=0, iniY=0;
	
	
	
	uint8 rgb[3];
	uint8 gris;
	uint16 *color= warholPal;
	int i,j,k;
	uint8 *mapa = (uint8*)warholBitmap;
	static uint8 linea [256];
  
	for (i=0;i<256;i++){
		rgb[0]= color[i] & 31; //rojo
		rgb[1]= (color[i] >>5) & 31;//verde
		rgb[2]= color[i] >>10;//azul
		gris = (30*rgb[0] + 59*rgb[1] + 11*rgb[2])/100;
		BG_PALETTE[i]=RGB15(gris,gris,gris)|BIT(15);
	}//Hasta aquí imagen en escala de grises
	
	//Recorremos el mapa para comprobar color de gris y hacerlo apuntar una de las dos posicines de la paleta
	for(i=0;i<256; i++){
		for(j=0;j<256;j++){
			if((BG_PALETTE[mapa[i*256+j]] & 31 ) > 20){
			linea[j] = 1;
			}else{
			linea[j] = 0;
			}
		}
		dmaCopy(linea,BG_GFX+i*256,256);
		for(k=0; k<256;k++)
			linea[k] = linea[k]+2;
		dmaCopy(linea,BG_GFX+128+i*256,256);
		for(k=0; k<256;k++)
			linea[k] = linea[k]+2;
		dmaCopy(linea,BG_GFX+256*256+i*256,256);
		for(k=0; k<256;k++)
			linea[k] = linea[k]+2;
		dmaCopy(linea,BG_GFX+256*256+128+i*256,256);
	}
	BG_PALETTE[0]= RGB15(20,0,0);
	BG_PALETTE[1]=	RGB15(31,31,31);
	BG_PALETTE[2]=    RGB15(0,0,25);
	BG_PALETTE[3]=   RGB15(25,31,25);
	BG_PALETTE[4]=    RGB15(10,10,0);
	BG_PALETTE[5]=	   RGB15(25,25,31);
	BG_PALETTE[6]=	   RGB15(0,0,20);
	BG_PALETTE[7]=	   RGB15(31,31,20);
	
	
	
	
	if (KEY_TOUCH & keysDown()){
		touchRead (& pos ) ;
		int x = (pos.px-8)/24;
		int y = (pos.py-8)/24;
		if (x >= 0 && x <= 7 && y >= 0 && y <= 5) {
			iniX = (pos.px-8)/24;
			iniY = (pos.py-8)/24;
		}
	}
	if (KEY_TOUCH & keysHeld()) {
		touchRead(&pos);
		finX = (pos.px-8)/24;
		finY = (pos.py-8)/24;
	}
	if (KEY_TOUCH & keysUp()){
		intercambia(iniX, iniY, finX, finY, mapaTeselado);
	}
	
// 	for(;;) {
// 		int i;
// 		for (i=256; i<512; ++i) {
// 			bgTransform[2]->xdx = i;
// 			bgTransform[2]->ydy = i;
// 			swiWaitForVBlank();
// 		}
// 		for (i=512; i>256; --i) {
// 			bgTransform[2]->xdx = i;
// 			bgTransform[2]->ydy = i;
// 			swiWaitForVBlank();
// 		}
// 	}
	return 0;
}
	
void intercambia(int iniX,int  iniY, int finX,int  finY, uint16 *mapa){
	int i;
	int inicio = iniY*3 + 32 + iniX*3 + 1;
	int fin= finY*2 + 32 + iniX*3 + 1;
	
	for (i=0;i<3;i++){
		mapa[fin+i]= mapa[inicio+i];
		mapa[fin+32+i] = mapa[inicio+64+i];
	}
}



  
  
